#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "randomgenerateclass.h"
#include "bubblesortclass.h"
#include "quicksortclass.h"

#include <vector>

#include <QThread>

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1.创建子线程对象
    QThread* randomThread = new QThread;
    QThread* bubbleThread = new QThread;
    QThread* quickThread = new QThread;

    // 2.创建任务类对象
    RandomGenerateClass* randomGenerate = new RandomGenerateClass;
    BubbleSortClass* bubble = new BubbleSortClass;
    QuickSortClass* quick = new QuickSortClass;

    // 3.将任务对象移动到子线程中
    randomGenerate->moveToThread(randomThread);
    bubble->moveToThread(bubbleThread);
    quick->moveToThread(quickThread);

    // 4.启动子线程

    // 点击按钮后创建一个线程产生随机数
    connect(ui->pushButton_generate, &QPushButton::clicked, this, [=]() {
        randomThread->start();                        // 启动线程
        emit informCount(ui->spinBox_count->value()); // 向随机数生成线程发送信号
    });
    // 配置链接，随机数生成类收到通知后产生随机数
    connect(this, &MainWindow::informCount, randomGenerate, &RandomGenerateClass::generateRandom);

    // 接收产生的随机数，并显示
    connect(randomGenerate, &RandomGenerateClass::sendVector, this, [=](std::vector<int> randomVector) {
        this->randomNumber = randomVector; // 记录产生的随机数
        ui->listWidget->clear();           // 清除之前的数据
        // 显示在随机数列表中
        for (int i = 0; i < randomVector.size() && i < 50; i++) // 只显示前50个
        {
            ui->listWidget->addItem(QString::number(randomVector[i]));
        }
    });

    // 点击排序按钮后，发送开始排序信号
    connect(ui->pushButton_sort, &QPushButton::clicked, this, [=]() {
        bubbleThread->start();              // 启动线程
        quickThread->start();               // 启动线程
        emit startSort(this->randomNumber); // 发送排序信号
    });

    // 配置链接，排序类收到信号后开始排序
    connect(this, &MainWindow::startSort, quick, &QuickSortClass::sort);
    connect(this, &MainWindow::startSort, bubble, &BubbleSortClass::sort);

    // 显示冒泡排序结果
    connect(bubble, &BubbleSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_bubble->clear();                         // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 50; i++) // 只显示前50个
        {
            ui->listWidget_bubble->addItem(QString::number(resultVector[i]));
        }
    });

    // 显示快速排序结果
    connect(quick, &QuickSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_quick->clear();                          // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 50; i++) // 只显示前50个
        {
            ui->listWidget_quick->addItem(QString::number(resultVector[i]));
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
